package cn.org.gs.path;

import org.junit.Test;

import java.io.File;
import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;

public class FilesDemo {

    @Test
    public void testCreate() {
        Path path = Paths.get("d:\\atguigu");
        try {
//            Files.createDirectory()方法，用于根据 Path 实例创建一个新目录
            Path newDir = Files.createDirectory(path);
        } catch(FileAlreadyExistsException e){
            // 目录已经存在
        } catch (IOException e) {
            // 其他发生的异常
            e.printStackTrace();
        }
    }

    // Files.copy()方法从一个路径拷贝一个文件到另外一个目录
    // 如果目标文件已经存在，则抛出一个 java.nio.file.FileAlreadyExistsException 异常。
    // 如果有其他错误，则会抛出一个 IOException。例如，如果将该文件复制到不存在的目录，则会抛出 IOException。
    @Test
    public void testCopy() {
        Path sourcePath = Paths.get("d:\\atguigu\\1.txt");
        Path destinationPath = Paths.get("d:\\atguigu\\002.txt");
        try {
            Files.copy(sourcePath, destinationPath);
            // Files.copy()方法的第三个参数。如果目标文件已经存在，这个参数指示 copy()方法覆盖现有的文件。
            // Files.copy(sourcePath, destinationPath, StandardCopyOption.REPLACE_EXISTING);
        } catch(FileAlreadyExistsException e) {
            // 目录已经存在
        } catch (IOException e) {
            // 其他发生的异常
            e.printStackTrace();
        }
    }

    // Files.move()用于将文件从一个路径移动到另一个路径。移动文件与重命名相同，但是
    // 移动文件既可以移动到不同的目录，也可以在相同的操作中更改它的名称。
    @Test
    public void testRemove() {
        Path sourcePath = Paths.get("d:\\atguigu\\002.txt");
        Path destinationPath = Paths.get("d:\\atguigu\\001.txt");
        try {
            // Files.move()的第三个参数。这个参数告诉 Files.move()方法来覆盖目标路径上的任何现有文件。
            Files.move(sourcePath, destinationPath,
                    StandardCopyOption.REPLACE_EXISTING);
        } catch (IOException e) {
            //移动文件失败
            e.printStackTrace();
        }
    }

    @Test
    public void testDelete() {
        Path path = Paths.get("d:\\directory1\\新建文本文档.txt");

        try {
            Files.delete(path);
        } catch (IOException e) {
            // 删除文件失败，如果 Files.delete()不能删除文件(例如，文件或目录不存在)，会抛出一个 IOException。
            e.printStackTrace();
        }
    }

    /**
     * （1）Files.walkFileTree()方法包含递归遍历目录树功能，将 Path 实例和 FileVisitor
     *  作为参数。Path 实例指向要遍历的目录，FileVisitor 在遍历期间被调用。
     * （2）FileVisitor 是一个接口，必须自己实现 FileVisitor 接口，并将实现的实例传递给
     *  walkFileTree()方法。在目录遍历过程中，您的 FileVisitor 实现的每个方法都将被调
     *  用。如果不需要实现所有这些方法，那么可以扩展 SimpleFileVisitor 类，它包含
     *  FileVisitor 接口中所有方法的默认实现。
     * （3）FileVisitor 接口的方法中，每个都返回一个 FileVisitResult 枚举实例。
     *  FileVisitResult 枚举包含以下四个选项:
     *  CONTINUE 继续
     *  TERMINATE 终止
     *  SKIP_SIBLING 跳过同级
     *  SKIP_SUBTREE 跳过子级
     */
    @Test
    public void testWalkFileTree() {
        Path rootPath = Paths.get("d:\\atguigu");

        String fileToEnd = File.separator + "001.txt";

        try {
            Files.walkFileTree(rootPath, new SimpleFileVisitor<>() {
                @Override
                public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                    String fileString = file.toAbsolutePath().toString();
                    System.out.println("pathString = " + fileString);

                    if(fileString.endsWith(fileToEnd)) {
                        System.out.println("file found at path : " + file.toAbsolutePath());
                        return FileVisitResult.TERMINATE;
                    }
                    return FileVisitResult.CONTINUE;
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
    }



}
